package loja.model.venda.pedido;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "pedido_venda")
public class PedidoVenda implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue
	private Long idPedidoVenda = 0L;
	private Calendar data;
	private BigDecimal valor = BigDecimal.ZERO;
	private Boolean status = false;
	@OneToMany(cascade = CascadeType.ALL)
	private List<ItemPedidoVenda> itensPedidoVenda = new ArrayList<>();

	public PedidoVenda() {
	}

	public Long getIdPedidoVenda() {
		return idPedidoVenda;
	}

	public void setIdPedidoVenda(Long idPedidoVenda) {
		this.idPedidoVenda = idPedidoVenda;
	}

	public Calendar getData() {
		return data;
	}

	public void setData(Calendar data) {
		this.data = data;
	}

	public BigDecimal getValor() {

		BigDecimal soma = BigDecimal.ZERO;

		if (itensPedidoVenda.size() == 0)
			return soma;

		for (ItemPedidoVenda itemPedidoVenda : itensPedidoVenda) {

			BigDecimal subtotal = BigDecimal.ZERO;
			BigDecimal preco = BigDecimal.ZERO;
			BigDecimal quantidade = BigDecimal.ZERO;

			if (itemPedidoVenda.getItemEstoque().getPreco() != null)
				preco = itemPedidoVenda.getItemEstoque().getPreco();

			if (itemPedidoVenda.getQuantidade() != null)
				quantidade = new BigDecimal(itemPedidoVenda.getQuantidade());

			subtotal = preco.multiply(quantidade);
			soma = soma.add(subtotal);
		}

		this.valor = soma;

		return valor;
	}

	public void setValor(BigDecimal valor) {
		this.valor = valor;
	}

	public Boolean getStatus() {
		return status;
	}

	public void setStatus(Boolean status) {
		this.status = status;
	}

	public List<ItemPedidoVenda> getItensPedidoVenda() {
		return itensPedidoVenda;
	}

	public void setItensPedidoVenda(List<ItemPedidoVenda> itensPedidoVenda) {
		this.itensPedidoVenda = itensPedidoVenda;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((data == null) ? 0 : data.hashCode());
		result = prime * result
				+ ((idPedidoVenda == null) ? 0 : idPedidoVenda.hashCode());
		result = prime
				* result
				+ ((itensPedidoVenda == null) ? 0 : itensPedidoVenda.hashCode());
		result = prime * result + ((status == null) ? 0 : status.hashCode());
		result = prime * result + ((valor == null) ? 0 : valor.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		PedidoVenda other = (PedidoVenda) obj;
		if (data == null) {
			if (other.data != null)
				return false;
		} else if (!data.equals(other.data))
			return false;
		if (idPedidoVenda == null) {
			if (other.idPedidoVenda != null)
				return false;
		} else if (!idPedidoVenda.equals(other.idPedidoVenda))
			return false;
		if (itensPedidoVenda == null) {
			if (other.itensPedidoVenda != null)
				return false;
		} else if (!itensPedidoVenda.equals(other.itensPedidoVenda))
			return false;
		if (status == null) {
			if (other.status != null)
				return false;
		} else if (!status.equals(other.status))
			return false;
		if (valor == null) {
			if (other.valor != null)
				return false;
		} else if (!valor.equals(other.valor))
			return false;
		return true;
	}

}
